package com.wlr.study.leetcode;

/**
 * @author lerong.wang
 * @version 1.0.0
 * @description
 * @date 2024/12/25 16:36
 */
import java.lang.reflect.Field;
import java.util.ArrayList;

public class ArrayListCapacity {

    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>(10);
        for (int i = 0; i < 20; i++) {
            list.add(i);
        }
        System.out.println("Size: " + list.size());
        System.out.println("Capacity: " + getCapacity(list));
    }

    /**
     * 获取ArrayList的当前容量。
     *
     * @param list ArrayList实例
     * @param <T>  ArrayList中元素的类型
     * @return 容量，如果发生异常则返回-1
     */
    private static <T> int getCapacity(ArrayList<T> list) {
        // 使用try-with-resources确保Field在使用后被关闭
        try {
            Field field = ArrayList.class.getDeclaredField("elementData");
            field.setAccessible(true);
            Object[] elementData = (Object[]) field.get(list);
            return elementData.length;
        } catch (Exception e) {
            // 使用Java 21的记录模式（可选）
            // RecordError error = new RecordError(e);
            // error.log();

            // 传统的异常处理方式
            e.printStackTrace();
            return -1;
        }
    }

    // 可选的记录模式类，用于记录异常（Java 21特性）
    /*
    record RecordError(Exception e) {
        void log() {
            e.printStackTrace();
        }
    }
    */
}